/* arc4.h
**
** Copyright (c) 2007, Meadhbh S. Hamrick
** All rights reserved.
** 
** Redistribution  and  use  in  source  and  binary  forms,  with  or  without
** modification, are permitted provided that the following conditions are met:
** 
**  * Redistributions of  source code must  retain the above  copyright notice,
**    this list of conditions and the following disclaimer.
** 
**  * Redistributions in binary form must reproduce the above copyright notice,
**    this list of conditions and the following disclaimer in the documentation
**    and/or other materials provided with the distribution.
** 
**  * Neither the  name of  Project Meadhbh  nor the names of  its contributors
**    may be used  to endorse  or promote  products derived from this  software
**    without specific prior written permission.
** 
** THIS SOFTWARE IS PROVIDED BY  THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY  EXPRESS OR IMPLIED WARRANTIES,  INCLUDING, BUT NOT  LIMITED TO, THE
** IMPLIED WARRANTIES  OF MERCHANTABILITY AND FITNESS FOR  A PARTICULAR PURPOSE
** ARE DISCLAIMED.  IN NO  EVENT SHALL THE  COPYRIGHT OWNER OR  CONTRIBUTORS BE
** LIABLE  FOR  ANY  DIRECT,   INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
** CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT  LIMITED  TO,  PROCUREMENT  OF
** SUBSTITUTE GOODS  OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
** INTERRUPTION)  HOWEVER CAUSED  AND ON  ANY THEORY  OF LIABILITY,  WHETHER IN
** CONTRACT,  STRICT LIABILITY,  OR  TORT (INCLUDING  NEGLIGENCE OR  OTHERWISE)
** ARISING IN ANY WAY  OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
** 
** $Id: arc4.h 66 2007-11-08 07:18:51Z msh.mobile $
*/

/* Macro Definitions */
#ifndef _H_ARC4
#define _H_ARC4

#define mc_ssc_arc4_encrypt(c,i,il,o,ol,bw) mc_ssc_arc4_update(c,i,il,o,ol,bw)
#define mc_ssc_arc4_decrypt(c,i,il,o,ol,bw) mc_ssc_arc4_update(c,i,il,o,ol,bw)

/* File Inclusions */

/* Typedefs, Structs, Enums, Unions */

typedef struct {
  uint32_t a;
  uint32_t b;
  uint8_t sbox[ 256 ];
} tMCArc4;

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

  /* Function Prototypes */

  void mc_ssc_arc4_clone( tMCArc4 *new_context, tMCArc4 *old_context );
  void mc_ssc_arc4_clear( tMCArc4 *context );
  void mc_ssc_arc4_initialize( tMCArc4 *context, uint8_t *key, uint32_t key_length );
  void mc_ssc_arc4_update( tMCArc4 *context, uint8_t *input, uint32_t input_length, uint8_t *output, uint32_t output_length, uint32_t *bytes_written );
  void mc_ssc_arc4_keystream( tMCArc4 *context, uint8_t *output, uint32_t output_length );

#if defined( MC_SSC_ARC4_PRINT )
  void mc_ssc_arc4_print( tMCArc4 *context );
#endif

  /* Global Variable Declarations */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _H_MCRYPTO */
